/**
 * @(#)ProxyHelper.java	0.1 Nov 6, 2007
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.wideskill.rpg4ejb3.type;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author: Luigi Scarpato <luigi.scarpato at wideskill.com>
 * 
 */
public class ProxyHelper {

	private static String getProxyUri(Object proxy) throws SecurityException,
			NoSuchFieldException, IllegalArgumentException,
			IllegalAccessException {
		InvocationHandler handler = Proxy.getInvocationHandler(proxy);
		Field f = handler.getClass().getDeclaredField("uri");
		f.setAccessible(true);
		//InvokerLocator locator = (InvokerLocator) f.get(handler);
		//return locator.getOriginalURI();
		return null;
	}

	public static boolean isNormalOjbProxy(Object proxyOrObject) {
		return (proxyOrObject instanceof Proxy)
				&& Proxy.isProxyClass(proxyOrObject.getClass())
				&& (Proxy.getInvocationHandler(proxyOrObject) instanceof InvocationHandler);
	}

	public static final Object getRealObject(Object objectOrProxy) {
		if (isNormalOjbProxy(objectOrProxy)) {
			String msg;

			try {
				return ((InvocationHandler) Proxy
						.getInvocationHandler(objectOrProxy));
			} catch (ClassCastException e) {
				throw e;
			} catch (IllegalArgumentException e) {
				throw e;
			} 
		}
		return objectOrProxy;
	}
}
